<?php
namespace Api\Controller;

use Think\Controller;

class CommonController extends Controller
{
    // 用户
    private $user = null;

    // 不需要登录验证的url，不能使用大写，不然有bug
    protected $without = [
        // api相关
        'api/sms',
        'api/province',
        'api/city',
        'api/region',
        // 用户
        'user/register',
        'user/login',
        'user/logout',
        'user/forgetpassword',
        'user/resetpassword',
        'user/isexists',
        // 分类相关
        'category/index',
        'category/getchilds',
        'category/getparents',
        // 商品相关
        'goods/index',
        'goods/search',
        'goods/specItem',
        'goods/review',
        'goods/search',
        // 广告相关
        'ad/appstart',
        // 首页
        'index/index',
        // 店铺
        'shop/index',
        'shop/goods',
        // 资讯
        'article/index',
        'article/category',
        'article/search',
        // 测试相关
        'index/test',
    ];

    public function __construct()
    {
        parent::__construct();

        // pv记录
        $this->pv();

        // app检查
        $this->appCheck();

        // token 检查
        $this->token();
    }

    /**
     * 检查是否登录过期，因为都是基于接口开发，所以检查key
     * @return [type] [description]
     */
    protected function token()
    {
        if ($this->isLogin()) {
            return;
        }

        $token = I('post.token', '', 'trim');

        if (C('DEV')) {

            $user_id = 1;

        } else {

            empty($token) && error(401, '缺少必要的参数token');

            if (!$user_id = decrypt_token($token)) {
                error(402, 'token验证失败');
            }

            $user_info = S('user_token_' . $user_id);
            if ($user_info['expire'] < CUR_TIMESTAMP || $user_info['uuid'] != UUID || $user_info['version'] != VERSION || $user_info['device_type'] != DEVICE) {
                // error(406, '登录过期，请重新登录');
            }
        }

        $user = S('user_info_' . $user_id);
        if (!$user) {
            $user = M('user')
                ->field('*')
                ->find($user_id);
            $user && S('user_info_' . $user_id, $user);
        }

        if (!$user) {
            error(403, '用户不存在');
        }

        // 定义全局使用变量
        define('USER_ID', $user_id);
        $this->user = $user;
    }

    /**
     * app检查（设备类型，设备号，app版本信息）
     * @return [type] [description]
     */
    public function appCheck()
    {
        if (C('DEV')) {
            $_SERVER = array_merge($_SERVER, [
                'HTTP_DEVICE'  => 'android',
                'HTTP_UUID'    => 'linlianhuai-uuid',
                'HTTP_VERSION' => '1.0.0',
            ]);
        }

        $device  = I('server.HTTP_DEVICE', '', 'trim');
        $uuid    = I('server.HTTP_UUID', '', 'trim');
        $version = I('server.HTTP_VERSION', '', 'trim');

        // 设备类型
        !in_array($device, ['android', 'ios']) && error(407, '设备类型出错');
        define('DEVICE', $device);

        // 设备号
        !$uuid && error(408, '设备号出错');
        define('UUID', $uuid);

        // app版本信息
        !$version && error(409, 'app版本信息出错');
        define('VERSION', $version);

    }

    /**
     * pv 记录
     * @return [type] [description]
     */
    private function pv()
    {
        if (C('PV')) {
            $pv_log = [
                'domain'      => get_domain(),
                'ip'          => get_client_ip(),
                'agent'       => get_client_agent(),
                'request_uri' => $_SERVER['REQUEST_URI'],
                'method'      => REQUEST_METHOD,
                'param'       => json_encode(I('param.')),
                'session'     => json_encode(session()),
                'cookie'      => json_encode(cookie()),
                'headers'     => json_encode(getallheaders()),
                'add_time'    => CUR_DATETIME,
            ];
            M('pv_log')->add($pv_log);
        }
    }

    /**
     * 登录控制，处理不需要登录的控制器
     * @return [type] [description]
     */
    protected function isLogin()
    {
        $is_check = in_array(strtolower(CONTROLLER_NAME . "/" . ACTION_NAME), $this->without);

        return $is_check;
    }

    /**
     * 空操作
     * @return [type] [description]
     */
    public function _empty()
    {
        error(302, '访问路径有误');
    }
}
